home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / dll / traynotify.c < prev    next >
C/C++ Source or Header  |  2004-01-10  |  5KB  |  203 lines

  1. /*-------------------------------------------------------------
  2.   traynotify.c : fill background of tray in taskbar
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tcdll.h"
  10. #include "newapi.h"
  11.  
  12. /* Globals */
  13.  
  14. void InitTrayNotify(HWND hwnd);
  15. void EndTrayNotify(void);
  16.  
  17. /* Statics */
  18.  
  19. static LRESULT CALLBACK WndProcTrayNotify(HWND, UINT, WPARAM, LPARAM);
  20. static void OnPaintTray(HWND hwnd, HDC hdc);
  21. static void OnCustomDraw(HWND hwnd, HWND hwndFrom, const LPNMCUSTOMDRAW pnmcd);
  22.  
  23. static HWND m_hwndTrayNotify = NULL, m_hwndToolbar = NULL;
  24. static HWND m_hwndClock = NULL;
  25. static WNDPROC m_oldWndProcTrayNotify = NULL;
  26. static LONG m_oldClassStyle, m_oldStyle;
  27.  
  28.  
  29. /*--------------------------------------------------
  30.   initialize
  31. ----------------------------------------------------*/
  32. void InitTrayNotify(HWND hwndClock)
  33. {
  34.     HWND hwnd;
  35.     
  36.     EndTrayNotify();
  37.     
  38.     if(!(g_winver&WINME) && !(g_winver&WIN2000)) return;
  39.     
  40.     if(GetMyRegLong(NULL, "NoClock", FALSE)) return;
  41.     
  42.     if(GetMyRegLong(NULL, "FillTray", FALSE) == FALSE) return;
  43.     
  44.     if(GetMyRegLong(NULL, "UseBackColor", TRUE) == FALSE) return;
  45.     
  46.     m_hwndClock = hwndClock;
  47.     m_hwndTrayNotify = GetParent(hwndClock);  // TrayNotifyWnd
  48.     
  49.     if(IsSubclassed(m_hwndTrayNotify)) return;
  50.     
  51.     /* ---------- search toolbar ----------- */
  52.     
  53.     m_hwndToolbar = NULL;
  54.     hwnd = FindWindowEx(m_hwndTrayNotify, NULL, "ToolbarWindow32", NULL);
  55.     if(!hwnd)
  56.     {
  57.         hwnd = FindWindowEx(m_hwndTrayNotify, NULL, "SysPager", NULL);
  58.         if(hwnd)
  59.             hwnd = FindWindowEx(hwnd, NULL, "ToolbarWindow32", NULL);
  60.     }
  61.     m_hwndToolbar = hwnd;
  62.     
  63.     /* ---------- subclassify ------------ */
  64.     
  65.     m_oldClassStyle = GetClassLong(m_hwndTrayNotify, GCL_STYLE);
  66.     SetClassLong(m_hwndTrayNotify, GCL_STYLE,
  67.         m_oldClassStyle|CS_HREDRAW|CS_VREDRAW);
  68.     
  69.     m_oldWndProcTrayNotify = 
  70.         (WNDPROC)GetWindowLong(m_hwndTrayNotify, GWL_WNDPROC);
  71.     SetWindowLong(m_hwndTrayNotify, GWL_WNDPROC, (LONG)WndProcTrayNotify);
  72.     
  73.     m_oldStyle = GetWindowLong(m_hwndTrayNotify, GWL_STYLE);
  74.     SetWindowLong(m_hwndTrayNotify, GWL_STYLE,
  75.         m_oldStyle & ~(WS_CLIPCHILDREN|WS_CLIPSIBLINGS));
  76.     
  77.     InvalidateRect(m_hwndTrayNotify, NULL, TRUE);
  78.     
  79.     if(m_hwndToolbar)
  80.     {
  81.         if(g_winver&WINXP)
  82.             SendMessage(GetParent(m_hwndToolbar), WM_SYSCOLORCHANGE, 0, 0);
  83.         else
  84.             SendMessage(m_hwndToolbar, WM_SYSCOLORCHANGE, 0, 0);
  85.     }
  86. }
  87.  
  88. /*--------------------------------------------------
  89.   clear up
  90. ----------------------------------------------------*/
  91. void EndTrayNotify(void)
  92. {
  93.     if(m_hwndTrayNotify && IsWindow(m_hwndTrayNotify))
  94.     {
  95.         SetWindowLong(m_hwndTrayNotify, GWL_STYLE, m_oldStyle);
  96.         
  97.         if(m_oldWndProcTrayNotify)
  98.             SetWindowLong(m_hwndTrayNotify, GWL_WNDPROC,
  99.                 (LONG)m_oldWndProcTrayNotify);
  100.         
  101.         SetClassLong(m_hwndTrayNotify, GCL_STYLE, m_oldClassStyle);
  102.         
  103.         InvalidateRect(m_hwndTrayNotify, NULL, TRUE);
  104.         
  105.         if(m_hwndToolbar)
  106.         {
  107.             SendMessage(m_hwndToolbar, WM_SYSCOLORCHANGE, 0, 0);
  108.             InvalidateRect(m_hwndToolbar, NULL, TRUE);
  109.         }
  110.     }
  111.     
  112.     m_hwndTrayNotify = NULL;
  113.     m_hwndToolbar = NULL;
  114.     m_oldWndProcTrayNotify = NULL;
  115. }
  116.  
  117. /*------------------------------------------------
  118.    subclass procedure of TrayNotifyWnd
  119. --------------------------------------------------*/
  120. LRESULT CALLBACK WndProcTrayNotify(HWND hwnd, UINT message,
  121.     WPARAM wParam, LPARAM lParam)
  122. {
  123.     switch(message)
  124.     {
  125.         case WM_ERASEBKGND:
  126.             OnPaintTray(hwnd, (HDC)wParam);
  127.             return 1;
  128.         case WM_PAINT:
  129.         {
  130.             PAINTSTRUCT ps;
  131.             HDC hdc;
  132.             hdc = BeginPaint(hwnd, &ps);
  133.             OnPaintTray(hwnd, hdc);
  134.             EndPaint(hwnd, &ps);
  135.             return 0;
  136.         }
  137.         case WM_PRINTCLIENT:
  138.             OnPaintTray(hwnd, (HDC)wParam);
  139.             return 0;
  140.         case WM_SIZE:
  141.             if(m_hwndClock) SendMessage(m_hwndClock, WM_SIZE, 0, 0);
  142.             break;
  143.         case WM_NOTIFY:
  144.         {
  145.             LPNMHDR pnmh;
  146.             pnmh = (LPNMHDR)lParam;
  147.             if (pnmh->code == NM_CUSTOMDRAW && pnmh->idFrom == 0)
  148.             {
  149.                 LPNMCUSTOMDRAW pnmcd = (LPNMCUSTOMDRAW)lParam;
  150.                 if(pnmcd->dwDrawStage  == CDDS_ITEMPREPAINT)
  151.                     OnCustomDraw(hwnd, pnmh->hwndFrom, pnmcd);
  152.             }
  153.             break;
  154.         }
  155.     }
  156.     return CallWindowProc(m_oldWndProcTrayNotify, hwnd,
  157.         message, wParam, lParam);
  158. }
  159.  
  160. /*------------------------------------------------
  161.    paint background of TrayNotifyWnd
  162. --------------------------------------------------*/
  163. void OnPaintTray(HWND hwnd, HDC hdc)
  164. {
  165.     HDC hdcClockBack;
  166.     RECT rc;
  167.     
  168.     hdcClockBack = GetClockBackDC();
  169.     if(!hdcClockBack) return;
  170.     
  171.     GetClientRect(hwnd, &rc);
  172.     BitBlt(hdc, 0, 0, rc.right, rc.bottom,
  173.         hdcClockBack, 0, 0, SRCCOPY);
  174. }
  175.  
  176. /*------------------------------------------------
  177.    paint background of Toolbar
  178. --------------------------------------------------*/
  179. void OnCustomDraw(HWND hwnd, HWND hwndFrom, const LPNMCUSTOMDRAW pnmcd)
  180. {
  181.     HDC hdcClockBack;
  182.     POINT ptTray, ptToolbar;
  183.     int x, y;
  184.     
  185.     hdcClockBack = GetClockBackDC();
  186.     if(!hdcClockBack) return;
  187.     
  188.     ptTray.x = ptTray.y = 0;
  189.     ClientToScreen(hwnd, &ptTray);
  190.     
  191.     ptToolbar.x = ptToolbar.y = 0;
  192.     ClientToScreen(hwndFrom, &ptToolbar);
  193.     
  194.     x = ptToolbar.x - ptTray.x;
  195.     y = ptToolbar.y - ptTray.y;
  196.     
  197.     BitBlt(pnmcd->hdc, pnmcd->rc.left, pnmcd->rc.top,
  198.         pnmcd->rc.right - pnmcd->rc.left,
  199.         pnmcd->rc.bottom - pnmcd->rc.top,
  200.         hdcClockBack, x + pnmcd->rc.left, y + pnmcd->rc.top,
  201.         SRCCOPY);
  202. }
  203.